package com.deft.design.simple;

import java.util.concurrent.atomic.AtomicReference;

/**
 * @author zdl
 * @description CAS（AtomicReference）线程安全
 * @date 2022-04-22
 **/
public class CasSingleton {

    private static final AtomicReference<CasSingleton> INSTANCE = new AtomicReference<>();

    private CasSingleton() {
        System.out.println("CAS「AtomicReference」（线程安全）：");
        System.out.println("\r java并发库提供了很多原子类来支持并发访问的数据安全性：AtomicInteger、AtomicBoolean、AtomicLong、AtomicReference。");
        System.out.println("\r AtomicReference可以封装引用一个V实例，支持并发访问单例方式就是使用了这一特点。");
        System.out.println("\r 使用CAS的好处就是不需要使用传统的加锁方式保证线程安全，而是依赖于CAS的忙等算法，依赖于底层硬件实现，来保证线程安全。相对于其他锁的实现没有线程的切换和阻塞也就没有了额外的开销，并且支持较大的并发性。");
        System.out.println("\r 使用CAS的缺点就是忙等，如果一直没有获取到将会处于死循环中。");
    }

    public static CasSingleton getInstance() {
        for( ; ; ) {
            CasSingleton instance = INSTANCE.get();
            if (instance != null) {
                return instance;
            }
            INSTANCE.compareAndSet(null, new CasSingleton());
            return INSTANCE.get();
        }
    }
}
